Expresiones Lambda en Java. Parte 2

Segunda parte de esta serie de posts sobre expresiones lambda. En el post anterior vimos un ejemplo en el cual usamos expresiones lambda para definir la implementación de nuestra interfaz Operacion la cual servia para hacer operaciones sobre 2 números. Ahora bien, los ejemplos que vimos son de expresiones lambda de una sola linea. A continuación veremos un ejemplo de una expresión lambda de mas de una linea:

public class Ejemplo {

    public static void main(String[] args) {
        Operacion potencia = (a, b) -> {
            int resultado = (int)Math.pow(a, b);
            return resultado;
        };

        System.out.println("Potencia = " + potencia.calcular(3, 3));
    }
}

(La expresión lambda del ejemplo anterior se podría definir en una sola, pero se hizo en dos por propósito del ejemplo).

Como se puede ver, cuando la expresión lambda se compone de mas de una linea, los paréntesis son obligatorios, y si dicha expresión lambda regresa un valor (la cual es el caso) la palabra reservada return es obligatoria también. El resultado de ejecutar el siguiente codigo es el siguiente:

Potencia = 27

Java ofrece una serie de interfaces funcionales en el paquete java.util.function que podemos usar en nuestros programas, la cual nos permite evitar el crear nosotros interfaces funcionales propias a cada rato. Osea que en los ejemplos anteriores nos podríamos haber evitado crear la interfaz Operacion y en su lugar usar una interfaz propia de Java. La interfaz Operacion que creamos nosotros recibe dos parámetros y regresa algo, ya existe una interfaz funcional en Java que tiene ese comportamiento y se llama BinaryOperator. A continuación se muestra el ejemplo anterior usando la interfaz BinaryOperator:

public class Ejemplo {

    public static void main(String[] args) {
        BinaryOperator<Integer> potencia = (a, b) -> {
            int resultado = (int)Math.pow(a, b);
            return resultado;
        };

        System.out.println("Potencia = " + potencia.apply(3, 3));
    }
}

Revisemos un poco el tipo de interfaces funcionales que existen en Java:

Operator

Un Operator es una interfaz funcional que recibe un parámetro y regresa un valor que debe ser del mismo tipo del parámetro que se recibe. A continuación un ejemplo:

(a) -> a + 1;

Existe una variación que es el BynaryOperator, que fue el que vimos en el primer ejemplo de este post. Se diferencia de Operator en que recibe dos y no solo un parámetro:

(a, b) -> a + b;

Existen mas tipos de operator, para mas info revisar la documentación oficial.

Function

Un Function es similar a Operator con la diferencia de que el parámetro que se recibe y el valor que se regresa pueden ser de diferente tipo de dato. Un ejemplo:

(a) -> a.length(); //Se recibe un String y se regresa un int

Tambien existe BiFunction. Un ejemplo:

(a, b) -> a.charAt(b); //Se recibe un string y un int y se regresa otro int

Existen mas tipos de function, para mas info revisar la documentación oficial.

Supplier

Un Supplier es una interfaz funcional la cual no recibe ningún parámetro y regresa un valor, a continuación un ejemplo:

() -> "hello";  //No recibe ningún parámetro y regresa un String con el valor "hello"

Consumer

Y finalmente tenemos a Consumer, que es una interfaz que recibe algo y no regresa nada, es como un Supplier pero al revés. Veamos un ejemplo:

(a) -> System.out.println(a); //Recibe un parametro y lo imprime, si regresar nada

Y pues esas fueron las interfaces funcionales mas comunes que Java proporciona. Para ver la lista completa de interfaces funcionales podemos acceder al siguiente link: https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html (Este link es específico de la versión 8 de Java)

Entradas relacionadas

Dejar un Comentario